package org.ejs.bean;

import java.util.List;
import javax.ejb.Remote;

import org.ejs.network.ServerAddress;

/**
 * L'interface d'un noeud de l'anneau. Chaque noeud contient la liste des fichiers d'un client.
 * @author labassi
 *
 */
@Remote
public interface FileManagerRemote {

  /**
   * S'enregistre aupr�s du master pour s'ins�rer dans l'anneau. 
   * @param from L'adresse du client d�sirant se connecter.
 * @return FileManagerRemote
   */
  void connect(ServerAddress from);
  

  /**
   * Se d�connecter aupr�s du master pour �tre supprim� dans l'anneau
   */
  void disconnect();
  
  /**
   * Ajoute un fichier dans l'index du serveur
   * @param name Le nom du fichier � indexer
   */
  void add(String name);

  /**
   * Supprime le fichier dont le nom est sp�cifi� dans l'index du serveur
   * @param name Le nom du fichier � supprimer
   */
  void delete(String name);

  /**
   * Retourne la liste de tous les fichiers de l'anneau. Cette m�thode doit �tre appel�e par le noeud initiateur.
   * @return une liste contenant l'index de l'anneau
   */
  List<String> list();
  
  /**
   * Retourne une liste contenant l'index du noeud. Cette m�thode est appel�e par tous les noeuds 
   * sauf le noeud initiateur qui appelle {@link #list()}
   * @return une liste contenant l'index de l'anneau
   */
  List<String> list(ServerAddress addr,int cpt);
  
  boolean copy(String file, ServerAddress to);
  
  boolean copy(String file, ServerAddress from, ServerAddress to);
  
  boolean move(String file, ServerAddress addr);
  
  /**
   * Modifie le suivant du noeud courant
   * @param next Le nouveau suivant
   */
  void setNext(FileManagerRemote next);

  /**
   * Retourne le suivant du noeud courant
   * @return le suivant du noeud courant
   */
  FileManagerRemote getNext();
  
  void setAddress(ServerAddress addr);
  
  ServerAddress getAddress();
  String getTest();
  
  /**
   * Trouve un FileManager dans l'index du serveur en fonction du fichier recherché
   * @param name Le FileManagerRemote du fichier à trouver
   * @param me pour savoir quand un tour de boucle est fait
   */
  ServerAddress find(String name,FileManagerRemote me);
  
  void setPrevious(FileManagerRemote previous);
  
  FileManagerRemote getPrevious();
  
  List<String> getFiles();
  
  boolean move(String file, ServerAddress addr, ServerAddress to);
  boolean findA(String name, ServerAddress me);

}

